package com.xj.algorithm.leetcode;

/**
 * 密钥格式化
 */
public class L482_字符串指定格式进行格式化 {

    /**
     * 给定一个密钥字符串S，只包含字母，数字以及 '-'（破折号）。N 个 '-' 将字符串分成了 N+1 组。给定一个数字 K，重新格式化字符串，除了第一个分组以外，每个分组要包含 K 个字符，第一个分组至少要包含 1 个字符。两个分组之间用 '-'（破折号）隔开，并且将所有的小写字母转换为大写字母。
     * <p>
     * 给定非空字符串 S 和数字 K，按照上面描述的规则进行格式化。
     * <p>
     * 示例 1：
     * <p>
     * 输入：S = "5F3Z-2e-9-w", K = 4
     * <p>
     * 输出："5F3Z-2E9W"
     * <p>
     * 解释：字符串 S 被分成了两个部分，每部分 4 个字符；
     *      注意，两个额外的破折号需要删掉。
     * 示例 2：
     * <p>
     * 输入：S = "2-5g-3-J", K = 2
     * <p>
     * 输出："2-5G-3J"
     * <p>
     * 解释：字符串 S 被分成了 3 个部分，按照前面的规则描述，第一部分的字符可以少于给定的数量，其余部分皆为 2 个字符。
     *  
     * <p>
     * 提示:
     * <p>
     * S 的长度不超过 12,000，K 为正整数
     * S 只包含字母数字（a-z，A-Z，0-9）以及破折号'-'
     * S 非空
     */
    public static void main(String[] args) {
        System.out.println(licenseKeyFormatting("5F3Z-2e-9-w", 4));
        System.out.println(licenseKeyFormatting("2-5g-3-J", 2));
        System.out.println(licenseKeyFormatting("---", 2));

        System.out.println(licenseKeyFormattingGood("5F3Z-2e-9-w", 4));
        System.out.println(licenseKeyFormattingGood("2-5g-3-J", 2));
        System.out.println(licenseKeyFormattingGood("---", 2));
    }

    //自己的解法：数字分组，字母大写，增加分隔符
    public static String licenseKeyFormatting(String S, int K) {
        String s = S.replace("-", "");
        if (s.equals("")){
            return s;
        }

        int length = s.length();
        int group = length % K == 0 ? length / K : (length / K) + 1;
        int locate = length - (group - 1) * K;

        String result = "";
        result = result + s.substring(0, locate).toUpperCase();

        int next = locate;
        while (next + K <= length){
            result = result + "-"+s.substring(next, next+K).toUpperCase();
            next=next+K;
        }
        return result;
    }

    //精彩解法：stringbuffer既快又安全
    public static String licenseKeyFormattingGood(String S, int K) {
        char[] S_arr = S.toCharArray();
        StringBuilder sb = new StringBuilder();

        int j = 0;
        for(int i = S_arr.length - 1; i >= 0; i --){
            if(S_arr[i] == '-') continue;
            if(j % K == 0 && j != 0){
                sb.append('-');
            }
            sb.append(S_arr[i]);
            j++;

        }
        return sb.reverse().toString().toUpperCase();
    }

}
